#pragma once
#include <string>
#include <cmath>
#include "Bitstr.h"

using namespace std;
/** \brief Omvandlar heltal till str&auml;ng eller str&auml;ng till heltal
* Inneh&aringller &auml;ven en funktion f&ouml;r tv&aring;komplement
*/
class Omvandla
{
public:

	Omvandla()
	{
	}

	~Omvandla()
	{
	}

	void tal_str(int tal, string &str, int nrbits)
	{
		str = "";
		str.resize(nrbits);
		bool negativt = false;
		if (tal < 0)
		{
			tal = abs(tal);
			negativt = true;
		}
		
		for (int i = nrbits - 1; i >= 0; i--)
		{
			str[i] = (tal % 2) + 48;
			tal = tal / 2;
		}

		if (negativt)
			tva_komplement(str, nrbits);
	}

	int str_tal(string &str)
	{
		int l = str.length();
		int tal = 0;
		bool negativt = false;
		if (str[0] == '1')
		{
			tva_komplement(str, str.length());
			negativt = true;
		}

		for (int i = l - 1; i >= 0; i--)
		{
			tal += (str[i]-48) * pow(2, l - 1 - i);
		}

		if (negativt)
		{
			tal *= -1;
			tva_komplement(str, str.length());
		}

		return tal;
	}

	void tva_komplement(string &str, int nrbits)
	{
		Bitstr bitstr;
		string ett, sum;
		ett.resize(nrbits);
		sum.resize(nrbits);
		for (int i = 0; i < ett.length() - 1; i++)
			ett[i] = '0';
		ett[nrbits - 1] = '1';

		for (int i = 0; i < str.length(); i++)
		{
			if (str[i] == '0')
				str[i] = '1';
			else
				str[i] = '0';
		}
		bitstr.addstr(str, ett, sum);
		str = sum;
	}
};

